package com.tsp.ssm.controller;

import com.tsp.ssm.controller.validation.ValidGroup1;
import com.tsp.ssm.exception.CustomException;
import com.tsp.ssm.po.ItemsCustom;
import com.tsp.ssm.po.ItemsQueryVo;
import com.tsp.ssm.service.ItemsService;
import mybatisdemo.mybatisfirst;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.*;

/**
 * Created by 隼 on 2016/11/25.
 *
 *
	spring参数绑定过程
	默认支持的类型
 直接在controller方法形参上定义下边类型的对象，就可以使用这些对象。在参数绑定过程中，如果遇到下边类型直接进行绑定。
	HttpServletRequest
 通过request对象获取请求信息
	HttpServletResponse
 通过response处理响应信息
	HttpSession
 通过session对象得到session中存放的对象
	Model/ModelMap
 model是一个接口，modelMap是一个接口实现 。
 作用：将model数据填充到request域


 12.3	简单类型
 通过@RequestParam对简单类型的参数进行绑定。
 如果不使用@RequestParam，要求request传入参数名称和controller方法的形参名称一致，方可绑定成功。

 如果使用@RequestParam，不用限制request传入参数名称和controller方法的形参名称一致。

 通过required属性指定参数是否必须要传入，如果设置为true，没有传入参数，报下边错误


 */
@Controller
//为了对url进行分类管理 ，可以在这里定义根路径，最终访问url是根路径+子路径
@RequestMapping( value = "/items" )
public class ItemsController {
    // 商品分类
    //itemtypes表示最终将方法返回值放在request中的key
    @ModelAttribute("itemtypes")
    public Map<String, String> getItemTypes() {

        Map<String, String> itemTypes = new HashMap<String, String>();
        itemTypes.put("101", "数码");
        itemTypes.put("102", "母婴");

        return itemTypes;
    }


    //商品查询
   @Autowired
   private ItemsService itemsService;
    //限制http请求方法，可以post和get
    //method={RequestMethod.POST,RequestMethod.GET})
    @RequestMapping(value ="/queryItems", method ={RequestMethod.GET,RequestMethod.POST} )
    public ModelAndView queryItems(HttpServletRequest request , ItemsQueryVo itemsQueryVo) throws Exception {
        //测试forward后request是否可以共享
        System.out.println(request.getParameter("id"));

//        // 调用service查找 数据库，查询商品列表

        //pojo 在形参中让包装类型的pojo接收查询条件参数。
        //	注意：itemsCustom和包装pojo中的属性一致即可。
       List<ItemsCustom> itemsList = itemsService.findItemsList(itemsQueryVo);
//        Iterator iterator=itemsList.iterator();
//        while (iterator.hasNext()){
//            System.out.println(iterator.next().toString());
//        }

        // 返回ModelAndView
        ModelAndView modelAndView = new ModelAndView();
        // 相当 于request的setAttribut，在jsp页面中通过itemsList取数据
        modelAndView.addObject("itemsList", itemsList);

//


        // 指定视图
        // 下边的路径，如果在视图解析器中配置jsp路径的前缀和jsp路径的后缀，修改为
         //modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
        // 上边的路径配置可以不在程序中指定jsp路径的前缀和jsp路径的后缀
        modelAndView.setViewName("items/itemsList");

        return modelAndView;

    }


    //商品信息修改页面显示
    @RequestMapping( value = "/editItems" , method = RequestMethod.GET)
    public String editItems(Model model ,@RequestParam(value="id",required=true) Integer items_id)throws Exception {

        //@RequestParam里边指定request传入参数名称和形参进行绑定。
        //通过required属性指定参数是否必须要传入
        //通过defaultValue可以设置默认值，如果id参数没有传入，将默认值和形参绑定。

        //调用service根据商品id查询商品信息
        ItemsCustom itemsCustom=itemsService.findItemsById(items_id);
        //判断商品是否为空，根据id没有查询到商品，抛出异常，提示用户商品信息不存 在
        if(itemsCustom == null){
        throw new CustomException("修改的商品信息不存在!");
        }

//        ModelAndView modelAndView = new ModelAndView();
//
//
//        //将商品信息放到model
//        modelAndView.addObject("itemsCustom",itemsCustom);
//        modelAndView.setViewName("items/editItems");


        //通过形参中的model将model数据传到页面
        //相当于modelAndView.addObject方法
        model.addAttribute("itemsCustom", itemsCustom);

        return "items/editItems";
    }


    //商品信息修改提交
    // 在需要校验的pojo前边添加@Validated，在需要校验的pojo后边添加BindingResult
    // bindingResult接收校验出错信息
    // 注意：@Validated和BindingResult bindingResult是配对出现，并且形参顺序是固定的（一前一后）。
    // value={ValidGroup1.class}指定使用ValidGroup1分组的 校验
    // @ModelAttribute可以指定pojo回显到页面在request中的key(数据回显)
    @RequestMapping(value = "/editItemsSubmit" , method = {RequestMethod.POST})
    public String  editItemsSubmit(Model model,
                                   HttpServletRequest request,
                                   Integer id,
                                   @Validated(value ={ValidGroup1.class}) ItemsCustom itemsCustom, BindingResult bindingResult ,  //错误信息
                                   MultipartFile items_pic//接收商品图片
                        )throws Exception {

        // 获取校验错误信息
        if(bindingResult.hasErrors()){
            // 输出错误信息
            List<String> allErrorsS=new ArrayList<String>();
            List<ObjectError> allErrors = bindingResult.getAllErrors();
            for (ObjectError objectError : allErrors) {
                // 输出错误信息
                allErrorsS.add(new String(objectError.getDefaultMessage().getBytes("iso8859-1"),"utf-8"));
                System.out.println(new String(objectError.getDefaultMessage().getBytes("iso8859-1"),"utf-8"));

            }
            // 将错误信息传到页面
            model.addAttribute("allErrorsS", allErrorsS);
            // 出错重新到商品修改页面

            //可以直接使用model将提交pojo回显到页面（最简单）
//            model.addAttribute("items", itemsCustom);
            return "items/editItems";
        }
        //原始名称
        String originalFilename = items_pic.getOriginalFilename();
        //上传图片
        if(items_pic!=null && originalFilename!=null && originalFilename.length()>0){
            //存储图片的物理路径F:\Work___Space\apache-tomcat-8.0.36\webapps\img
            String pic_path = "F:\\Work___Space\\apache-tomcat-8.0.36\\webapps\\img\\";
            //新的图片名称
            String newFileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
            System.out.println(pic_path+newFileName);
            //新图片
            File newFile = new File(pic_path+newFileName);
            //将内存中的数据写入磁盘
            items_pic.transferTo(newFile);
            //将新图片名称写到itemsCustom中
            itemsCustom.setPic(newFileName);
        }


        //调用service更新商品信息，页面需要将商品信息传到此方法
          itemsService.updateItems(id, itemsCustom);

        /*
        * redirect重定向
        *商品修改提交后，重定向到商品查询列表。
        *redirect重定向特点：浏览器地址栏中的url会变化。修改提交的request数据无法传到重定向的地址。
        * 因为重定向后重新进行request（request无法共享）
        * forward页面转发
        *通过forward进行页面转发，浏览器地址栏url不变，request可以共享。
*/

        //重定向
        // 到商品查询列表
        //return "redirect:queryItems.action";

        //页面转发
       return "forward:queryItems.action";
        //return "success";
    }


    //批量删除商品信息
    @RequestMapping("/deleteItems")
    public String deleteItems(Integer[] items_id)throws  Exception{
        //调用service批量删除商品
        ///...................
        if(items_id==null){}
        else {
            for (Integer i : items_id) {
                System.out.println("id " + i.toString());
            }
        }
        return  "success";
    }

    //批量修改商品的页面，将商品信息查询出来 ，在页面中可以编辑商品信息
    @RequestMapping(value ="/editItemsQuery", method ={RequestMethod.GET,RequestMethod.POST} )
    public ModelAndView editItemsQuery(HttpServletRequest request , ItemsQueryVo itemsQueryVo) throws Exception {
//        // 调用service查找 数据库，查询商品列表


        List<ItemsCustom> itemsList = itemsService.findItemsList(itemsQueryVo);
//        Iterator iterator=itemsList.iterator();
//        while (iterator.hasNext()){
//            System.out.println(iterator.next().toString());
//        }

        // 返回ModelAndView
        ModelAndView modelAndView = new ModelAndView();
        // 相当 于request的setAttribut，在jsp页面中通过itemsList取数据
        modelAndView.addObject("itemsList", itemsList);

        modelAndView.setViewName("items/editItemsQuery");
        return modelAndView;

    }



    //批量修改商品的提交
    // 通过ItemsQueryVo接收批量提交的商品信息，将商品信息存储到itemsQueryVo中itemsList属性中。
    @RequestMapping("/editItemsAllSubmit")
    public String editItemsAllSubmit(ItemsQueryVo itemsQueryVo)throws Exception{
        List<ItemsCustom> list=itemsQueryVo.getItemsList();
        if(list!=null){
            Iterator<ItemsCustom> iterator=list.iterator();
                    while(iterator.hasNext()){
                        System.out.println(iterator.next().toString());
                    }
        }
        return  "success";
    }



    //c查询商品信息输出json
    //查询商品信息，输出json
    ///itemsView/{id}里边的{id}表示占位符，通过@PathVariable获取占位符中的参数，
    //如果占位符中的名称和形参名一致，在@PathVariable可以不指定名称
    @RequestMapping("/itemsView/{id}")
    public @ResponseBody
    ItemsCustom itemsView(@PathVariable("id") Integer id)throws Exception{

        //调用service查询商品信息
        ItemsCustom itemsCustom = itemsService.findItemsById(id);

        return itemsCustom;

    }


}
